home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / utility / ds0376 / lehrer.doc < prev    next >
Text File  |  1992-05-26  |  53KB  |  777 lines

  1.                Die Assembler-Sprache - eine Fibel für Anfänger
  2.                        (C) 1983 by David Whitman
  3.                            Deutsche Übersetzung bei TOASTI
  4.                      Inhaltsverzeichnis
  5.       Einleitung.........................................2
  6.       Der Computer als Bit-Muster-Manipulator............3
  7.       Einführung: Aufzeichnungs-Systeme für Bit-Muster...5
  8.       Die Adressierung des Speichers.....................7
  9.       Der Speicherinhalt: Daten und Programme............8
  10.       Die Entwicklung der Assembler-Sprache..............9
  11.       Die 8088 CPU......................................11
  12.       Syntax der Assembler-Sprache......................14
  13.       Der Stack.........................................17
  14.       Software Interrupts (Programmunterbrechungen).....19
  15.       Pseudo-Operationen (Unechte Operationen)..........21
  16.       Lehrgang..........................................23
  17.                                                                       2
  18.       >>EINLEITUNG<<
  19.       Viele Leute erwarten von CHASM mehr Hilfe, weil sie sich für das
  20.       Lernen der Assembler-Sprache interessieren. Sie sind Anfänger und
  21.       haben nur wenige Vorstellungen, wo sie beginnen sollen. Diese Fibel
  22.       weist jene Benutzer ein. Erfahrene Benutzer werden hier wahrscheinlich
  23.       wenig finden, was sie nicht bereits wissen.
  24.       Dieser Text wird, da er nur eine Fibel ist, nicht alles lehren, was
  25.       man über die Programmierung in Assembler wissen muß. Sein Zweck ist es,
  26.       Ihnen einiges vom Wortschatz und den Gedanken zu vermitteln, die Ihnen
  27.       beim Lernen hilfreich sein werden.
  28.       Ich muß eine kleine Einschränkung machen: Ich betrachte mich als rela-
  29.       tiver Anfänger in der Assembler-Programmierung. Ein wichtiger Grund für
  30.       das Schreiben von CHASM war der Versuch, die Assembler-Programmierung
  31.       dadurch zu erlernen. Ich glaube, ich habe einiges gelernt, aber es ist
  32.       ziemlich wahrscheinlich, daß einige meiner Vorstellungen, die ich damit
  33.       verband, mehr oder weniger falsch sind. Trotzdem habe ich seitdem eine
  34.       Menge voll funktionstüchtiger Assembler-Programme geschaffen.
  35.                                                                       3
  36.       >>DER COMPUTER ALS BIT-MUSTER-MANIPULATOR.<<
  37.       Jeder hat eine Vorstellung darüber, was ein Computer tut. Auf der
  38.       einen Seite denkt man an eine Maschine, welche BASIC-Programme aus-
  39.       führen kann.  Eine andere Vorstellung ist, daß der Computer ein zahlen-
  40.       fressendes Gerät ist. Ich verwende den Computer gerade zur Textver-
  41.       arbeitung, weil ich diese Fibel schreibe.
  42.       Ich hätte gern einen allgemeineren Begriff eingeführt als gerade den,
  43.       welche Art von Maschine ein Computer ist: ein Bit-Muster-Manipulator.
  44.       Ich bin sicher, daß jeder darüber bescheid weiß, was ein *Bit* ist
  45.       (Anmerkung: Jedes von *Sternen* eingeschlossene Wort in dieser Fibel
  46.       ist so zu lesen, als ob es KURSIV gedruckt wäre). Ein Bit kennt zwei
  47.       Zustände: ein und aus, normalerweise dargestellt mit den Symbolen
  48.       "1" und "0". Denken Sie in diesem Zusammenhang nicht an die Ziffern
  49.       1 und 0.  Sie sind bloß Abkürzungen für den momentanen Zustand
  50.       eines Bits.
  51.       Der Speicher Ihres Computers besteht aus riesigen Sammlungen von
  52.       Bits, jedes davon kann sich entweder im Zustand 1 oder 0 (ein oder
  53.       aus) befinden.
  54.       Das Herz Ihres Computers ist normalerweise ein 8088 Microprozessor-Chip
  55.       von Intel. Dieser Chip kann alle Bits manipulieren, die in ihrer
  56.       Gesamtheit den Speicher des Computers ausmachen.
  57.       Der 8088 behandelt Bits in Blöcken, weshalb wir besondere Namen
  58.       für zwei Größen von Bit-Blöcken einführen werden, mit denen der 8088
  59.       gerne arbeitet. Ein *Byte* besteht aus einem Block von acht Bits.
  60.       Ein *Word* besteht aus zwei Bytes, das entspricht also sechzehn Bits.
  61.       Eine Sammlung von Bits enthält ein Muster, festgelegt durch den Zustand
  62.       von seinen Bits. Hier sehen Sie einige typische, ein Byte lange,
  63.       Muster:        10101010         11111111         00001111
  64.       Wenn Sie in Mathe gut sind, dann können sie ziemlich einfach heraus-
  65.       finden, daß ein Byte genau 256 verschiedene Muster enthalten kann.
  66.       Genauso kann ein Word 65.536 verschiedene Muster enthalten.
  67.                                                                       4
  68.       Nun zu der wichtigsten Idee der Assembler-Programmierung.
  69.       Halten Sie sich fest! Diese Bit-Muster können dazu verwendet werden,
  70.       andere Dinge darzustellen, indem jedes Muster eine bestimmte Sache
  71.       darstellt.
  72.       Es hört sich seltsam an,
  73.       aber IBM hat aus dieser Idee *Millionen* gemacht.
  74.       Zum Beispiel kann man bei Verwendung aller Muster eines Words für
  75.       ganze Zahlen alle Werte von 0 bis 65536 oder von -32768 bis 32767
  76.       darstellen. Diesen Zahlenbereich werden Sie häufig antreffen, wie
  77.       beispielsweise den Bereich der möglichen Zeilennummern oder die
  78.       möglichen Werte einer Integer-Variable in BASIC-Programmen. Das
  79.       erklärt diese etwas willkürlich erscheinenden Begrenzungen:
  80.       BASIC verwendet zum Speichern von Integer-Variablen und Zeilen-
  81.       nummern Words.
  82.       Ein anderes Beispiel: Man kann die verschiedenen Muster eines Bytes
  83.       dazu verwenden, um eine Reihe von willkürlich ausgewählten kleinen
  84.       Bildern auf dem Bildschirm darzustellen. Wenn Sie in Ihrem BASIC-Hand-
  85.       buch im Anhang G nachsehen, werden Sie feststellen, daß es *genau* 256
  86.       verschiedene Zeichen gibt, die man auf dem Bilschirm darstellen kann.
  87.       Ihr Computer verwendet jeweils ein Byte, um ein Zeichen auf jeder
  88.       Position des Bilschirms anzuzeigen.
  89.       Ohne daß ich zuweit vorausgreife, möchte ich doch kurz erwähnen,
  90.       daß es über 256 grundlegende Wege beim 8088 gibt, die gespeicherten
  91.       Bit-Muster zu manipulieren. Dies deutet auf eine andere Verwendung der
  92.       Bit-Muster hin, die wir später noch genauer erläutern werden.
  93.       Das Wichtigste ist, daß wir mit den Bit-Mustern alles darstellen können,
  94.       was wir wollen. Außerdem kann man die Muster auf unterschiedliche Art
  95.       und Weise manipulieren, Ergebnisse produzieren und ausgewählte Teile
  96.       davon weiterverarbeiten oder anzeigen.
  97.                                                                       5
  98.       >>EINFÜHRUNG: EIN AUFZEICHNUNGS-SYSTEM FÜR BIT-MUSTER<<
  99.       Da es sehr wichtig ist, wäre es schön, wenn wir eine passende
  100.       Möglichkeit hätten, die verschiedenen Bit-Muster darzustellen, die wir
  101.       noch besprechen werden. Eine Möglichkeit kennen wir schon, nämlich die
  102.       Auflistung der einzelnen Bits als eine Reihe von 1'en und 0'en. Dieses
  103.       System ist ziemlich ungeschickt und fehleranfällig. Sind die folgenden
  104.       Muster identisch oder nicht?
  105.       1111111011111111                         1111111101111111
  106.       Sie hatten bestimmt Probleme, den Unterschied zu erkennen. Sie sind
  107.       einfacher zu unterscheiden, wenn man sie in handlichere Stücke unter-
  108.       teilt und diese dann vergleicht. Hier sehen Sie nochmals dieselben
  109.       Muster, unterteilt in Blöcken zu vier Bits:
  110.       1111 1110 1111 1111                  1111 1111 0111 1111
  111.       Einige Clowns haben diesen vier-Bit-Blöcken den Namen *Nibble* gegeben,
  112.       wahrscheinlich weil vier Bits ein halbes Byte sind. Ein Nibble ist
  113.       ganz einfach handzuhaben. Ein Nibble kann nur 16 verschiedene Muster
  114.       darstellen, und die meisten Leute können diese Muster sehr einfach
  115.       unterscheiden.
  116.       Jedes verschiedene Nibble-Muster hat von den Computer-Wissenschaftlern
  117.       ein einzelnes Zeichen bekommen. Den ersten zehn Mustern wurden die
  118.       Ziffern "0" bis "9" zugeordnet, für die restlichen Muster werden die
  119.       Buchstaben "A" bis "F" verwendet.
  120.       Untenstehend sehen Sie die "Nibble-Muster-Codierung":
  121.       0000 = 0    0001 = 1    0010 = 2    0011 = 3
  122.       0100 = 4    0101 = 5    0110 = 6    0111 = 7
  123.       1000 = 8    1001 = 9    1010 = A    1011 = B
  124.       1100 = C    1101 = D    1110 = E    1111 = F
  125.       Durch Verwendung der Nibble-Codierung können wir zwei ähnliche
  126.       Word-Muster in der folgenden übersichtlicheren und kürzeren Form
  127.       darstellen:
  128.                      FEFF       FF7F
  129.                                                                       6
  130.       Natürlich war die Zuweisung der Zeichen für die verschiedenen
  131.       Nibble-Muster nicht so willkürlich, wie es vielleicht erscheinen mag.
  132.       Ein aufmerksamer Leser, der das System der binären Zahlen erkannt hat,
  133.       wird die zugrundeliegenden Regeln der Zuweisung bemerkt haben. Falls
  134.       die 1'en und 0'en der Muster als wirkliche *Zahlen* übersetzt
  135.       werden, anstatt nur als reine Zeichen für den Bit-Zustand, dann zeigen
  136.       deren Zeichen von "0" bis "9" die entsprechenden dezimalen Ziffern
  137.       an.
  138.       Die letzten sechs Muster erhalten die Bezeichnung von "A" bis "F",
  139.       und alle Zeichen von "0" bis "F" zusammen bilden die Ziffern des
  140.       *hexadezimalen* Zahlensystems. Durch diese Zeichen-Zuweisung zu
  141.       den verschiedenen Nibble-Mustern bestätigt sich das alte Vorurteil,
  142.       daß der Computer eine rein zahlenverarbeitende Maschine ist.
  143.       Obwohl diese Zeichen-Zuweisung eine wichtige Übersetzung dieser
  144.       Zeichen ist, hat man bald aufgehört, großartig darüber nachzu-
  145.       denken, wie man eine Kurzform zum Schreiben der Bit-Muster finden kann.
  146.       Weil einige Nibble-Muster wie eine Zahl aussehen, ist es meist
  147.       notwendig, irgendwie anzuzeigen, daß man ein bestimmtes Muster
  148.       meint. In BASIC tut man dies, indem man Schriftzeichen "&H" an den
  149.       Anfang des Muster hinzufügt: &H1234. Eine häufiger vorkommende Verein-
  150.       barung ist, daß man den Buchstaben "H" ans Ende des Muster zufügt:
  151.       1234H. Bei beiden Darstellungen steht das H für "hexadezimal".
  152.       Sie sollten schließlich mehr über die Verwendung des hexadezimalen
  153.       Zahlensystems lernen, da es sehr wichtig für Sie sein wird.
  154.       Ich möchte an dieser Stelle nicht weiter darauf eingehen, warum
  155.       zahlreiche Bücher bessere Abhandlungen über dieses Thema enthalten als
  156.       diese Fibel. Sie können Wissenslücken über dieses bedeutende Thema
  157.       später "füllen".
  158.                                                                       7
  159.       >>DIE ADRESSIERUNG DES SPEICHERS<<
  160.       Wie Sie vorhin schon erfahren haben kann der 8088 Chip im Innern
  161.       Ihres Computers die Bit-Muster seines Speichers manipulieren.
  162.       So ist es z. B. möglich, Bit-Muster von einem Ort zum andern zu
  163.       kopieren, bestimmte Bits zu setzen oder zu löschen, oder Bit-Muster
  164.       als Zahlen zu interpretieren und damit Rechenoperationen auszu-
  165.       führen. Um diese Funktionen ausführen zu können, muß der 8088 wissen,
  166.       welchen Teil des Speichers er gerade bearbeitet hat. Eine bestimmte
  167.       Stelle im Speicher wird durch seine *Adresse* markiert.
  168.       Eine Adresse ist ein Zeiger in den Speicher. Jede Adresse zeigt auf den
  169.       Anfang eines ein Byte langen Blockes im Speicher.  Der 8088 hat die
  170.       Fähigkeit, 1.048.576 verschiedene Bytes des Speichers zu unterscheiden.
  171.       Es dürfte für Sie wohl keine Überaschung sein, zu hören, daß Adressen
  172.       durch Bit-Muster dargestellt werden. Man benötigt 20 Bits, um alle
  173.       1.048.576 verschiedene Bytes unterscheiden zu können, und deshalb wer-
  174.       den die Adressen mit 5 Nibble-Zeichen dargestellt. MS-DOS zum Beispiel
  175.       speichert ein Bit-Muster, das Informationen über die installierte
  176.       Ausrüstungen Ihres IBM PC enthält, in dem Word, welches an der
  177.       Adresse 00410 beginnt. Wenn die Adresse als hexadezimale Zahl angesehen
  178.       wird, so hat das zweite Byte von diesem Word die Adresse um eins größer
  179.       als 00410, also 00411.
  180.       Der 8088 ist nicht sehr erfreut, 20 Bits zu bearbeiten. Der größte
  181.       Block, den er bearbeiten kann, ist ein 16 Bit Word. In Wirklichkeit
  182.       berechnet der 8088 eine 20 Bit Adresse aus einer Kombination von
  183.       zwei Words, einem Teil-Word und ein Zusatz-Word. Der Kombinations-
  184.       Vorgang sorgt dafür, daß die zwei Words als hexadezimale Zahlen er-
  185.       kannt und aufaddiert werden. Zwei Words ergeben miteinander kombi-
  186.       niert ein 20 Bit Muster, indem die zwei Words um eine Nibble-Stelle
  187.       verschoben zusammenaddiert werden:
  188.           0040      4 Teil-Nibble
  189.            0010     4 Zusatz-Nibble
  190.          --------
  191.           00410     5 Nibble Adresse
  192.       Wegen dieser Art und Weise der Adressen-Berechnung werden sie oft
  193.       in der Form "Teil:Zusatz" hingeschrieben. Deshalb könnten die
  194.       Adressen der eben vorgenommenen Berechnung auch so geschreiben werden:
  195.       0040:0010
  196.                                                                       8
  197.       >>DER SPEICHERINHALT: DATEN UND PROGRAMME<<
  198.       Den Inhalt des Speichers kann man grob einteilen in zwei Klassen.
  199.       Einerseits in *Daten*, genauer gesagt in Bit-Muster zum Arbeiten für
  200.       den 8088. Die Bedeutung dieser Bit-Muster wird festgelegt durch den
  201.       Computer, den Sie gerade benutzen.
  202.       Die zweite Klasse des Speicherinhalts sind die *Anweisungen*. Der 8088
  203.       kann in seinen Speicher sehen und das Bit-Muster, das er dort sieht,
  204.       als eines seiner rund 200 grundlegenden Operationen, die er kennt,
  205.       erkennen. Diese Auflistung von Operationen in Form von Bit-Mustern nennt
  206.       man die *Maschinensprache* des 8088. Ein Maschinensprache- *Programm*
  207.       beinhaltet eine Reihe von Bit-Mustern, die sich hintereinander im Spei-
  208.       cher befinden. Diese zusammenarbeitenden Operationen leisten einige
  209.       nützliche Dinge.
  210.       Bitte beachten Sie, daß der 8088 keine Möglichkeit hat, zu unter-
  211.       scheiden, ob ein Bit-Muster eine Anweisung oder ein Teil von Daten dar-
  212.       stellen soll. Es ist für den Chip möglich, zufällig an einer Stelle
  213.       mit dem Lesen zu beginnen und Daten als Anweisungen oder umgekehrt zu
  214.       interpretieren. Wenn dies geschieht können einige sehr bizarre Sachen
  215.       passieren. Unter Assembler-Programmierern ist dies bekannt als
  216.       "Systemabsturz".
  217.                                                                       9
  218.       >>DIE ENTWICKLUNG DER ASSEMBLER-SPRACHE<<
  219.       Die Muster, aus denen ein Assemblerprogramm besteht, können ziemlich
  220.       verwirrend sein. So sieht zum Beispiel das Muster, welches dem 8088
  221.       sagt, die Bits in dem Byte der Speicheradresse 5555 umzudrehen,
  222.       folgendermaßen aus:
  223.       F6 16 55 55
  224.       Das ist nicht sehr informativ, obwohl man die darinnen die Adresse
  225.       5555 erkennen kann. Vor langer Zeit mußten die alten Vakuum-Röhren-
  226.       Computer noch mit mühsamen übersetzten Bit-Mustern programmiert
  227.       werden, welche die Folge der gewünschten Anweisungen darstellten.
  228.       Es ist wohl unnötig, zu erwähnen, das diese Arbeitsweise unglaublich
  229.       langweilig und fehleranfällig war. Schließlich kamen diese Programierer
  230.       auf die Idee, diese Aufgabe des Übersetzens in die passenden
  231.       Bit-Muster dem Computer zu übertragen, und so wurde die Assembler-
  232.       Sprache geboren.
  233.       Assembler stellt jede der vielen Operationen, die der Computer
  234.       ausführen kann, als ein *Mnemonic*, einer kurzen, leicht zu merkenden
  235.       Buchstabenfolge dar. In der Booleschen Algebra wird z. B. die logische
  236.       Operation, die den Wert eines Bits umdreht, "not" genannt, und deshalb
  237.       ist in Assembler folgendes gleichbedeutend mit dem vorhergehenden
  238.       Maschinensprache-Muster:
  239.           NOTB [5555]
  240.       Die eckigen Klammern um die 5555 meint ungefähr: "der Inhalt der
  241.       Speicheradresse".  Das "B" am Ende von "NOTB" zeigt an, daß wir mit
  242.       einem Byte des Speichers, nicht mit einem Word, arbeiten wollen.
  243.       Unglücklicherweise kann der 8088 mit dem String "NOTB" nicht sehr
  244.       viel anfangen. Was man braucht, ist ein besonderes Programm, das mit
  245.       dem 8088 läuft und den String "NOTB" in das Muster F6 16 umwandelt.
  246.       Dieses Programm heißt Assembler. Einen Assembler kann man sich wie
  247.       einen Fleischwolf vorstellen, der Programme in der Assembler-Sprache
  248.       verarbeitet und Maschinen-Programme ausspuckt.
  249.       Ein Assembler liest ein Assembler-Programm und übersetzt es Zeile
  250.       für Zeile. Heraus kommt ein Maschinensprache-Programm. Das zu über-
  251.       setzende Assembler-Programm nennt man den *Source File*, das übersetzte
  252.       Maschinensprache-Programm nennt man *Object File*. Die erzeugten
  253.       Maschinensprache-Muster nennt man *Object Code*.
  254.                                                                      10
  255.       Außerdem wird während der Assemblierung ein *Listing* erzeugt, welches
  256.       das Ergebnis der Assemblierung zusammengefaßt darstellt. Das Listing
  257.       zeigt jede Zeile des Source File, zusammen mit dem Source File und
  258.       und dem erzeugten Object Code. Wenn der Assembler irgeneine Zeile
  259.       im Source File nicht versteht, so fügt er am Ende des Listings
  260.       eine Fehlermeldung ein, die den aufgetretenen Fehler genauer
  261.       beschreibt.
  262.       Die allerersten Assembler-Programmierer mußten Ihr Assembler-
  263.       Programm in Maschinensprache schreiben, weil sie keine andere Wahl
  264.       hatten. Ich schrieb CASM in BASIC. Wenn Sie genauer darüber nachdenken,
  265.       werden Sie viele Verbindungen zwischen Assembler und BASIC finden.
  266.       Irgendein Programmierer von Mircrosoft schrieb den BASIC-Interpreter
  267.       in Assembler, und ich verwandte BASIC zum Schreiben eines Assemblers.
  268.       Ich hoffe, eines Tages eine neue Version von CHASM in Maschinensprache
  269.       zu programmieren, die dann ungefähr hundertmal schneller sein wird
  270.       als die augenblickliche Version.
  271.                                                                      11
  272.       >>Die 8088 CPU<<
  273.       Die vorangehenden Erörterungen haben Ihnen (so hoffe ich) einige allge-
  274.       meine Grundlagen vermittelt, die Ihnen bei der Programmierung in Assem-
  275.       bler und Maschinensprache behilflich sein werden. An diese Stelle möchte
  276.       ich nun etwas mehr ins Detail gehen, beginnend bei der Untersuchung der
  277.       inneren Struktur des 8088 Microprozessors, vom Standpunkt des Program-
  278.       mierers aus. Die Erörterung ist eine gekürzte Fassung der Information-
  279.       en, die ich dem Buch "The 8086 Book" entnommen habe (Autoren: Russel
  280.       Rector und George Alexy; Verlag: Osborne/McGraw-Hill).
  281.       Wenn Sie dies einmal verdaut haben, würde ich empfehlen, das o. a. Buch
  282.       durchzuarbeiten. Beim Benutzen von CHASM werden Sie das Buch jedenfalls
  283.       irgendwie brauchen, damit Ihnen die unterschiedlichen Anweisungen des
  284.       8088 und deren Mnemnonics (=kurze Buchstabenfolge) klar werden.
  285.       Innerhalb des 8088 gibt es eine Anzahl von *Registern*, jedes von ihnen
  286.       kann einen 16-Bit-Wert speichern. In der Assembler-Sprache hat jedes
  287.       dieser Register einen Kurznamen, bestehend aus zwei Buchstaben. Es gibt
  288.       14 Register, ihre Kurznamen sind:
  289.       AX BX CX DX     SP BP    SI DI     CS DS SS ES    PC ST
  290.       Die Register unterscheiden sich ein wenig voneinander, sie haben ver-
  291.       schiedene Verwendungen, aber sie können in zwei grobe Klassen eingeteilt
  292.       werden. Die *Allgemein*-Register sind AX, BX, CX und DX. Ebendiese sind
  293.       Register, die Muster aus dem Speicher holen und zwischenspeichern, die
  294.       dann innerhalb des 8088 verarbeitet werden. Diese Register können Sie
  295.       verwenden, wofür Sie wollen.
  296.       Jedes der Allgemein-Register kann man in zwei 8-Bit-Register aufteilen,
  297.       welche eigene, aber ähnliche Namen besitzen. Deshalb teilt man das CX-
  298.       Register auf in das CH- und CL-Register. Das "H" und das "L" stehen für
  299.       "High" beziehungsweise "Low". Jedes Allgemein-Register
  300.       wird also in ein Paar Register eingeteilt (High und Low).
  301.       Das AX-Register, und seine 8-Bit Low-Hälfte, das AL-Register, sind
  302.       etwas Besonderes. Hauptsächlich aus historischen Gründen wird dieses
  303.       Register auf den *Akkumulator* zurückgeführt. Einige Operationen des
  304.       8088 können nur mit dem Inhalt dieses *Akkumulator*-Registers ausgeführt
  305.       werden, viele andere sind um einiges schneller, wenn sie in Verbindung
  306.       mit diesem Register ausgeführt werden.
  307.                                                                      12
  308.       Eine andere Gruppe von Registern sind die *Segment*-Register (CS DS SS
  309.       ES). Diese Register enthalten Teilwerte zur Berechnung von Speicher-
  310.       Adressen. Das CS-Register (Code-Segment-Register) wird jedesmal ver-
  311.       wendet, wenn der 8088 auf den Speicher zugreift, um Anweisungen daraus
  312.       zu lesen. Das DS-Register (Data-Segment-Register) wird zum Lesen von
  313.       Daten-Muster benutzt. Das SS-Register wird beim Stack-Zugriff benutzt
  314.       (mehr über den Stack später). Das ES-Register ist das Extra-Segment-
  315.       Register. Die meisten Spezial-Anweisung benutzen das ES-Register beim
  316.       Speicher-Zugriff, außerdem können Sie sich über die Verwendung des DS-
  317.       Registers hinwegsetzen und damit das ES-Register ersetzen, wenn Sie zwei
  318.       seperate Daten-Zonen unterhalten wollen.
  319.       Die *Pointer* (SP BP) und *Index* (DI SI) Register dienen der Verwirk-
  320.       lichung der indirekten Adressierung, die eine sehr mächtige Technik des
  321.       Speicherzugriffs darstellt. Die indirekte Adressierung gehört nicht zum
  322.       Thema dieser kleinen Einführung. Das SP-Register wird benötigt, um
  323.       den Stack im Speicher zu realisieren (nochmals: mehr über den Stack
  324.       später). Neben diesen besonderen Funktionen können die BP-,DI- und SI-
  325.       Register als zusätzliche Mehrzweck-Register verwendet werden. Obwohl
  326.       es möglich wäre, die Werte im SP-Register direkt zu manipulieren,
  327.       sollte man trotzdem die Finger davon lassen, weil es sonst zu einem
  328.       Durcheinander im Stack kommen kann (Systemabsturz!).
  329.       Schließlich gibt es noch zwei Register, die jedoch zum direkten Manipu-
  330.       lieren relativ uninteressant sind. Das erste ist der *Programm Counter*,
  331.       PC. Dieses Register enthält immer einen Zeiger auf die Adresse der
  332.       nächsten Anweisung, die ausgeführt werden soll. Obwohl es nicht er-
  333.       laubt ist, Werte in dieses Register zu schreiben, können Sie indirekt
  334.       Werte in dieses Register schreiben und deshalb die nächste auszuführende
  335.       Anweisung bestimmen, indem Sie ähnliche Anweisungen wie es in BASIC die
  336.       GOTO und GOSUB Befehle sind, geben. Gelegentlich werden Sie auch
  337.       auf den Begriff *IP* (Instruction Pointer) stoßen, der gleichbedeutend
  338.       mit dem PC ist.
  339.       Das letzte Register ist auch relativ uninteressant. Es ist das *Status*
  340.       Register, ST. Dieses hat zwei verschiedene Namen, nämlich FL (Flag
  341.       Register) und PSW (Programm Status Word). Letzterer ist in der
  342.       Geschichte begründet, da dieser Name einer besonderen Speicherplatz-
  343.       Adresse gegeben wurde, die eine ähnliche Funktion bei dem antikem
  344.       IBM 360 Computer inne hatte.
  345.                                                                      13
  346.       Das Status-Register besteht aus einer Reihe von Ein-Bit-*Flags*, welche
  347.       auf die Arbeit des 8088 Einfluß nehmen. Es gibt besondere Anweisungen,
  348.       die es ermöglichen, jedes dieser Flags zu setzen oder zu löschen.
  349.       Außerdem beeinflussen viele Anweisungen den Wert der Flags, und zwar
  350.       abhängig von ihrem Ergebnis. Eines der Bits des Status-Register wird
  351.       beispielsweise Zero-Flag genannt. Andere Anweisungen setzen das Zero-
  352.       Flag automatisch auf eins, wenn das Ergebnis einer Operation null
  353.       ist.
  354.       Das Setzen der Flags erscheint anfangs als unwichtiges Detail, später
  355.       werden Sie jedoch erfahren, das es Anweisungen gibt, mit denen man an-
  356.       hand des Flag-Musters bedingte Verzweigungen realisieren kann, ähnlich
  357.       wie "IF ... THEN GOTO" in BASIC. Die einzige Möglichkeit in Assembler,
  358.       Entscheidungen zu treffen und dementsprechend zu handeln, besteht im
  359.       Lesen und Auswerten der Flags.
  360.       Obwohl einige Anweisungen stillschweigend die Flags beinflussen, gibt
  361.       es eine Reihe von Anweisungen, die als einzige Wirkung die Flags in Ab-
  362.       hängigkeit von einem Test oder Vergleich setzen. Es ist allgemein üb-
  363.       lich, diese Vergleichs-Operationen kurz vor einer bedingten Verzweigung
  364.       zu verwenden. Zusammengenommen sind diese zwei Anweisungen genau das
  365.       wie folgende Befehle in BASIC:
  366.       IF (Vergleich) THEN GOTO (Zeilennummer)
  367.                                                                      14
  368.       >>Syntax der Assembler-Sprache<<
  369.       Im allgemeinen wird jede Zeile eines Assembler-Programms in ein be-
  370.       stimmtes Bit-Muster übersetzt, das eine einzelne grundlegende Operation
  371.       des 8088 ausführt.
  372.       Jede Zeile kann aus einem oder mehreren der folgenden Teile bestehen:
  373.       Zuerst aus einem Label, der nur eine Markierung einer Stelle darstellt.
  374.       Wenn Sie von einem Teil des Programmes einen anderen Teil aufrufen
  375.       möchten, müssen Sie einen Label an die aufzurufende Stelle setzen. Beim
  376.       Aufruf beziehen Sie sich dann auf den Label. Normalerweise kann der La-
  377.       bel aus einer beliebigen Zeichenfolge bestehen. Gewöhnlich verwendet
  378.       man dafür einen Namen, der Sie später an die Funktion des Programmteils
  379.       erinnert. CHASM nimmt an, daß jede Zeichenkette, die in der ersten
  380.       Spalte einer Zeile beginnt, ein Label sein soll. Nach dem Label, oder
  381.       falls der Text nicht in der ersten Spalte, sondern weiter rechts be-
  382.       ginnt, kommt die (mnemonische) Anweisung. Diese gibt genau an, was in
  383.       dieser Zeile ausgeführt werden soll. Eine Liste von über 200 Mnemonics,
  384.       zusammen mit ihren Übersetzungen können Sie dem Buch "The 8086 Book"
  385.       entnehmen. Die meisten Anweisungen für den 8088 benötigen einen oder
  386.       mehrere *Operanden*. Operanden sind Angaben, die verarbeitet werden.
  387.       Sie werden nach der mnemonischen Anweisung aufgelistet.
  388.       Es sind eine Anzahl von Operanden möglich. Die häufigsten Operanden
  389.       sind wohl die Register, die man an ihren Kurznamen (2 Buchstaben) er-
  390.       kennt. Eine andere Form von Operanden sind die *unmittelbaren Daten*,
  391.       das sind Bit-Muster, die irgendwo gespeichert oder mit anderen Mustern
  392.       verglichen werden sollen. Gewöhnlich werden unmittelbare Daten in der
  393.       hexadezimalen Form angegeben, markiert mit einem vorgestellten "H".
  394.       Einige Assembler erlauben außerdem andere Wege, um unmittelbare Daten
  395.       anzugeben, z. B. in Form einer Berechnung. CHASM ermöglicht fünf ver-
  396.       schiedene Formen, unmittelbare Daten anzugeben.
  397.                                                                      15
  398.       Eine Speicher-Adresse kann als Operand verwendet werden, indem man
  399.       sie als Zahl und in eckige Klammern schreibt (nun wissen Sie, wofür
  400.       man die eckigen Klammern benötigt. Ohne diese könnte man nicht zwischen
  401.       einer Adresse und den unmittelbaren Daten unterscheiden). Wenn Sie
  402.       einen Teil des Speichers für Daten reserviert und mit einem Label mar-
  403.       kiert haben (mehr darüber später), dann können Sie den Label anstelle
  404.       der Speicher-Adresse als Operand verwenden. Schließlich gibt es viele
  405.       Arten der indirekten Speicher-Adressierung, genaueres hierüber können
  406.       Sie in dem Buch "The 8086 Book" lesen.
  407.       Die letzte große Gruppe von Operanden sind Label. Verzweigende Anwei-
  408.       sungen benötigen einen Operanden, der ihnen sagt, wohin sie verzweigen
  409.       sollen. In der Assembler-Sprache kann man an Stellen, an die verzweigt
  410.       werden soll, Labels davorsetzen. Der Label kann dann als Operand bei
  411.       dem Verzweigungs-Befehl angegeben werden.
  412.       Häufig sind die aufgelisteten Operanden eines Befehl von großer Wichtig-
  413.       keit. Wenn Sie z. B. ein Bit-Muster von einem Platz zu einem anderen
  414.       kopieren wollen, müssen Sie angeben, von wo es kommt und wohin es
  415.       kopiert werden soll. Es wurde vereinbart, daß normalerweise der erste
  416.       Operand den *Bestimmungsort*, der zweite Operand die *Quelle* angibt.
  417.       Um das Bit-Muster im DX-Register in das AX-Register zu kopieren, könnten
  418.       Sie deshalb folgendes schreiben:
  419.               MOV AX,DX
  420.       Den Sinn des Befehls erkennt man auch, wenn man die Anweisung von
  421.       links nach rechts liest: Lade (MOV = engl. Abkürz. v. MOVE = bewegen)
  422.       das Register AX mit (Komma heißt "mit") dem Inhalt des Registers DX.
  423.       Auch CHASM hält sich an diese Schreibweise, die übrigens vom ASSEMBLY
  424.       LANGUAGE COMMUNITY vereinbart wurde.
  425.       Der letzte Teil einer Assembler-Zeile ist der *Kommentar*. Der Kommen-
  426.       tar wird vom Assembler vollkommen ignoriert, trotzdem ist er für Men-
  427.       schen *lebensnotwendig*, die versuchen, das Programm zu verstehen.
  428.       Assembler-Programme sind sehr schwer zu verstehen, und deshalb ist es
  429.       so enorm wichtig, viele Kommentare einzufügen, damit man sich auch
  430.       später noch daran erinnern kann, was jeder Teil des Programmes tun
  431.       soll. Berufsmäßige Assembler-Programmierer kommentieren *jede* Zeile
  432.       des Programms und erklären damit, was es tut, außerdem widmen Sie
  433.       einige Zeilen nur den zusätzlichen Erklärungen. So sollten Sie z. B.
  434.       das BIOS Source-Listing durcharbeiten, daß Sie im "Technischen Referenz-
  435.       Handbuch von IBM" finden. Über die Hälfte des Listings besteht aus
  436.       Kommentaren!
  437.                                                                      16
  438.       Da der Assembler Kommentare ignoriert, kosten diese nichts in Bezug
  439.       auf den Speicherplatz oder die Ausführungs-Geschwindigkeit beim über-
  440.       setzten Maschinenprogramm. Dies stellt einen krassen Gegensatz zu BASIC
  441.       da, wo jeder Kommentar das Programm verlangsamt und Speicherplatz
  442.       kostet. Im allgemeinen ist ein bestimmtes Zeichen notwendig, das dem
  443.       Assembler den Anfang des Kommentars anzeigt, damit dieser überlesen
  444.       wird. CHASM verwendet für die Markierung des Kommentars den
  445.       Semikolon (";").
  446.                                                                      17
  447.       >>DER STACK<<
  448.       Ich habe einige mal den Namen *Stack* erwähnt. Der Stack ist nur ein
  449.       kleiner Teil des Speicher, der für eine besondere Aufgabe reserviert
  450.       worden ist.
  451.       Damit Sie ein Bild davon bekommen, wie der Stack arbeitet, stellen Sie
  452.       sich ein Selbstbedienungsrestaurant vor, in dem ein Gerät mit einer Fe-
  453.       der Tabletts hält. Jedes gewaschene Tablett wird oben auf den Stapel des
  454.       Gerätes gelegt. Da das Gerät am Boden eine Feder enthält, sinkt der
  455.       ganze Stapel vom Gewicht des neuen Tabletts runter, und zwar soweit,
  456.       daß die Spitze des Stapels immer auf der gleichen Höhe über dem Boden
  457.       bleibt. Wenn ein Gast ein Tablett vom Stapel nimmt, so steigt das nach-
  458.       folgende Tablett an den Platz des fortgenommenen auf.
  459.       Im Computer wird der Stack zum Zwischenspeichern von Bit-Mustern verwen-
  460.       det, die z. B. von einem Programm oder Unterprogramm an ein anderes
  461.       übergeben werden sollen. Indem Werte auf den Stack gelegt werden, muß
  462.       die aufgerufene Routine keine bestimmte Adresse wissen, um die benötig-
  463.       ten Informationen zu erhalten, es braucht nur die obersten Werte vom
  464.       Stack zu holen.
  465.       Es gibt aber einen Kauderwelsch in Verbindung mit dem Stacks. Bit-Muster
  466.       werden auf den Stack *geschoben* und wieder *heruntergestoßen* (engl.
  467.       to push und to pop). Dementsprechend heißen die Befehle des 8088 eben-
  468.       falls PUSH und POP, es gibt aber noch mehr Stack-Befehle.
  469.       Weil Sie sich nicht darum kümmern müsssen, wo die Bit-Muster gespeichert
  470.       werden sollen, wird der Stack oft als Zwischenspeicher benutzt, um Bit-
  471.       Muster in einem Register, das man für andere Zwecke verwenden will, ab-
  472.       zulegen und später, wenn das Register wieder frei ist, wiederzuholen.
  473.       Es ist allgemein üblich, daß die ersten Anweisungen eines Unterprogramms
  474.       eine Reihe von PUSH-Befehlen sind, mit denen der Inhalt aller Register
  475.       gerettet wird, die vom Unterprogramm verwendet werden. Dies bezeichnet
  476.       man als *Sichern des Zustand* der Register. Am Ende des Unterprogramms
  477.       erhalten dann alle Register ihren ursprünglichen Inhalt wieder zurück
  478.       (POP-Befehl), man nennt dies das *Wiederherstellen des Zustands* der
  479.       Register. Ähnlich wie beim Tablett-Gerät ist der letzte Wert, den Sie
  480.       auf den Stack legen, der erste den Sie wieder herunterholen.
  481.       Wenn Sie einen Wert herunterholen, rutscht der vorletzte auf den Stack
  482.       gelegte Wert automatisch an die Spitze, genauso wie die Tabletts auf-
  483.       rücken, wenn ein Gast eines nimmt. Alles kommt vom Stack also in umge-
  484.       kehrter Reihenfolge wieder herunter, wie es hinaufgelegt wurde. Dies
  485.       nennt man auch die "last in, first out" Methode (*LIFO Stack*).
  486.                                                                      18
  487.       Natürlich gibt es im Speicher des Computer keine Feder. Vielmehr wird
  488.       der Stack mit Hilfe eines Register gesteuert, das immer anzeigt, an
  489.       welchem Speicherplatz sich der oberste Wert im Stack gerade befindet.
  490.       Wenn Sie etwas auf den Stack legen, so ändert ein Zeiger seinen Wert auf
  491.       die nächste verfügbare Speicher-Stelle und der Wert wird an dieser Platz
  492.       gespeichert. Wenn Sie einen Wert herunterholen, wird dieser vom ange-
  493.       zeigten Ort zurückkopiert und der Zeiger entsprechend verändert. Um den
  494.       Zeiger brauchen Sie sich nicht zu kümmern, weil all diese Schritte
  495.       automatisch mit der PUSH und POP Anweisung ausgeführt werden.
  496.       Das Register, das diesen Zähler enthält, ist der SP. Das ist auch der
  497.       Grund, warum Sie nie am SP herummurksen sollten. Erinnern Sie sich? Eine
  498.       Adresse wird aus zwei Words, dem Offset und dem Segment gebildet. Das
  499.       Segment Word des Stacks befindet sich im SS-Register, darum sollten Sie
  500.       auch daß SS-Register in Ruhe lassen. Wenn Sie das von CHASM erzeugte
  501.       Maschinen-Programm starten, setzt DOS automatisch das SP und SS Register
  502.       und reserviert einen Stack, der 128 Words speichern kann.
  503.                                                                      19
  504.       >>SOFTWARE INTERRUPTS<<
  505.       Ich habe es gewissenhaft vermieden, über die verschiedenen individuellen
  506.       Anweisungen zu sprechen, die der 8088 kennt, weil sonst dieser kleine
  507.       (einführende) Lehrgang ziemlich bald zu einem großen Buch heranwachsen
  508.       würde. Es gibt jedoch eine sehr wichtige Anweisung, die, wenn Sie davon
  509.       im Buch "The 8088 Book" lesen würden, als nicht sehr nützlich erschiene.
  510.       Im folgendem Teil soll nun erläutert werden, warum der *Software Inter-
  511.       rupt* (INT) trotzdem so wichtig ist.
  512.       Der 8088 reserviert die ersten 1024 Bytes des Speichers für 256
  513.       *Interrupt-Vektoren*. Jedes der zwei Words langen Interrupt-Vektoren
  514.       wird zum Speichern einer Speicher-Adresse (Segment:Offset) verwendet.
  515.       Wenn der 8088 ein Software-Interrupt antrifft, so legt er die Adresse
  516.       der nächsten Anweisung von dem aufrufenden Programm im Stack ab, und
  517.       verzweigt dann zu der Speicheradresse, auf die der durch den Operanden
  518.       bestimmte Interrupt-Vektor zeigt.
  519.       Dies scheint ein ziemlich umständlicher Weg zu sein, um im Programm zu
  520.       verzweigen, und Sie werden diese Methode wohl nie anwenden, um von
  521.       einem Teil des Programmes zum anderen zu verzweigen. Diese Anweisung
  522.       ist deshalb so wichtig, weil IBM eine ganze Reihe von nützlichen kleinen
  523.       (und größeren) Maschinensprache-Routinen in den Computer integriert
  524.       hat, und diese Interrupt-Vektoren darauf zeigen. Alle diese Routinen
  525.       sind so aufgebaut, daß sie nach ihrem Ablauf die auf dem Stack gelegte
  526.       Adresse wieder zurückholen und somit wieder an die richtige Stelle im
  527.       Programm zurückkehren.
  528.       Einige Routinen gehören zu DOS, ihre Dokumentation kann man im Anhang D
  529.       des DOS-Handbuchs finden. Der Rest von ihnen ist im ROM (Nur-Lese-
  530.       Speicher) gespeichert und umfasst das *BIOS* (das grundlegende Steuer-
  531.       system für Ein-/Ausgaben im Computer). Mehr Informationen über die
  532.       BIOS-Routinen können Sie dem Anhang A des "Technischen Referenz-Hand-
  533.       buchs" von IBM entnehmen. IBM verlangt für das Handbuch ungefähr $40,
  534.       aber alleine die Informationen im Anhang A sind ihr Geld wert.
  535.       Die Rountinen erledigen alle möglichen nützlichen Arbeiten, wie z. B.
  536.       Zeichen auf dem Bildschirm auszugeben, Daten von der Tastatur zu lesen,
  537.       usw. Im Grunde genommen erweitern die Software-Interrupts den 8088 um
  538.       eine ganze Reihe von mächtigen Anweisungen.
  539.                                                                      20
  540.       Schließlich ist es sehr einfach, die Software-Interrupts "umzubiegen"
  541.       auf ein eigenes Programm, wenn Ihnen eine Routine nicht gefällt und Sie
  542.       diese verbessern wollen. Dazu müssen Sie nur Ihr eigenes Programm laden
  543.       und die Standard-Interrupt-Vektoren neu initialisieren, indem Sie auf
  544.       Ihr eigenes Programm zeigen anstatt auf die internen Routinen. Nach
  545.       diesem Prinzip arbeiten viele Ram-Disks und Printer-Spooler. Die Pro-
  546.       gramme ändern den Vektor für die Disketten- oder Druckeransteuerung
  547.       so um, daß er auf sie selbst zeigt und führen dann die Funktion in
  548.       ihrer besonderen Art und Weise aus.
  549.       Damit dies ganz einfach geht, gibt es eine DOS-Interrupt-Routine, die
  550.       den Standard-Vektor löscht und dafür die neue Zieladresse des Vektors
  551.       einfügt. Es gibt noch eine andere DOS-Interrupt-Routine, die zum In-
  552.       stallieren von Maschinenprogrammen verwendet wird, ohne daß es zufällig
  553.       andere Programme löscht oder selbst gelöscht wird. Das Ganze ist wirk-
  554.       lich einfach und problemlos zu handhaben, wie Sie sehen.
  555.                                                                      21
  556.       >>PSEUDO-OPERATIONEN<<
  557.       Bisher könnten Sie meinen, daß jede Zeile eines Assembler-Programms
  558.       in eine Maschinensprache-Anweisung übersetzt werden kann. Tatsächlich
  559.       ist dies nicht immer so. Die meisten Assembler ermöglichen eine Reihe
  560.       von *Pseudo-Operationen*, die der Assembler zwar als erlaubten Befehl
  561.       anerkennt, die jedoch nicht in eine Maschinensprache-Anweisung umgewan-
  562.       delt werden können. Fast immer wird der Ausdruck "Pseudo-Operation"
  563.       abgekürzt und als *Pseudo-Op* bezeichnet. Manchmal werden Sie auch auf
  564.       *Assembler-Directiven* stoßen, die zwar wie eine Pseudo-Op aussehen,
  565.       jedoch nicht das Gleiche bewirken (Anm.: Directive = Befehl, der nur die
  566.       interne Arbeitsweise des Assemblers beeinflußt).
  567.       Eine weit verbreitete Pseudo-Op ist die *Gleichsetzung* mit dem *EQU*-
  568.       Befehl (von engl. to equate). Dieser erlaubt es Ihnen, einem konstanten
  569.       Wert einen Namen zu geben. Danach setzt der Assembler überall, wo er
  570.       auf diesen Namen trifft, automatisch den Wert der Konstante ein. Dadurch
  571.       sind Ihre Programme leichter zu verstehen, weil man anstelle irgendeines
  572.       bedeutungslosen Bit-Musters einen Namen sieht, der die Bedeutung des
  573.       Bit-Musters erklärt. Außerdem können Sie Ihr Programm leichter ändern,
  574.       da Sie nur dem Namen einen anderen Wert zuweisen brauchen, anstatt jede
  575.       Zeile des Programm durchzusehen und den Wert, falls er vorkommt, umzu-
  576.       ändern.
  577.       Ich möchte nur noch einen weiteren Pseudo-Op-Typ besprechen, mit dem
  578.       man Speicherplatz für Daten reservieren kann. Diese Pseudo-Op's haben
  579.       bei jedem Assembler ihre persönlichen Eigenheiten. CHASM kennt nur zwei
  580.       derartige Pseudo-Op's: DB (declare Byte) und DS (declare storage). DB
  581.       wird zum Anlegen kleiner Datenfelder verwendet, indem man ein Byte große
  582.       Werte in einer bestimmten Form angibt. DS reserviert ein relativ großes
  583.       Datenfeld, das jedoch immer mit dem gleichen Wert gefüllt wird.
  584.       Falls Sie vor einer Pseudo-Op, die Datenfelder anlegt, einen Label set-
  585.       zen, können Sie bei den meisten Assemblern den Label anstelle der wirk-
  586.       lichen Speicheradresse als Operanden verwenden. Der Assembler setzt
  587.       während des Übersetzungsvorgang automatisch die Speicheradresse anstelle
  588.       des Namens ein.
  589.       Viele Assembler haben eine große Anzahl von Pseudo-Op's. CHASM kennt
  590.       noch einige mehr als die hier besprochenen Pseudo-Op's.
  591.                                                                      22
  592.       >>LEHRGANG<<
  593.       Zum Abschluß dieser Fibel will ich Ihnen anhand eines Beispiels den
  594.       Vorgang des Schreibens, Assemblierens und Startens eines kurzen
  595.       Programms erläutern.
  596.       Unser Programm soll nur einen Text auf den Bildschirm schreiben und
  597.       dann zu DOS zurückkehren. Obwohl das Programm sehr einfach ist,
  598.       demonstriert es Ihnen eine Reihe von Punkten wie z. B. einen DOS-Funk-
  599.       tions-Aufruf, das Anlegen eines Datenfeldes und einen guten Programm-
  600.       Aufbau. Anhang D des DOS-Handbuchs erläutert die verschiedenen DOS-
  601.       Funktions- und Interrupt-Aufrufe, die einem Assembler-Programmierer zur
  602.       Verfügung stehen. Zum Ausgeben eines Textes auf den Bildschirm verwenden
  603.       wir Funktion 9. Sie sollten nun zuerst die Dokumentation dieser Funktion
  604.       in Ihrem DOS-Handbuch lesen.
  605.       Können Sie es verstehen? Diese Funktion benötigt im DX-Register die
  606.       Speicher-Adresse des Text-Strings und im AH-Register den Wert "9", da
  607.       ja die Funktion 9 aufgerufen werden soll, dann muß das Interrupt 21H
  608.       aufgerufen werden. Eigentlich übergeben wir nur Werte und lassen DOS
  609.       dann (mit Hilfe dieser Werte) für uns arbeiten.
  610.       Das Programm sieht dann folgendermaßen aus:
  611.            MOV AH, 9                 ;DOS Funktion 9 auswählen
  612.            MOV DX, OFFSET(MESSAGE)   ;Adresse des Text-Strings holen
  613.            INT 21H                   ;DOS aufrufen
  614.       Beachten Sie, daß keine der Zeilen am linken Rand beginnt (Spalte eins).
  615.       Wäre das nicht der Fall, würde CHASM die (mnemonischen) Anweisungen als
  616.       Label behandeln und somit sehr durcheinander geraten. Beachten Sie auch,
  617.       daß jede Zeile einen Kommentar enthält, der erklärt, was in der Zeile
  618.       gemacht werden soll.
  619.       Die zweite Zeile bedarf einer kleinen Erklärung. CHASM's OFFSET-Funktion
  620.       gibt die Speicher-Adresse des in den Klammern stehenden Ausdrucks zu-
  621.       rück, in unserem Fall vom Label MESSAGE. Wir wollen annehmen, daß wir
  622.       später im Programm Speicherplatz für unseren Text-String reservieren
  623.       wollen und die Speicheradresse dann mit dem Label "MESSAGE"benennen
  624.       wollen.
  625.                                                                      23
  626.       Nachdem der Text angezeigt worden ist, wollen wir zu DOS zurückkehren.
  627.       Wenn wir nicht deutlich sagen, daß wir zu DOS zurück wollen, arbeitet
  628.       der 8088 freudig weiter, indem er jeden Wert, der sich zufällig im Spei-
  629.       cher befindet, als Befehl ausführt. Erinnern Sie sich an den System-
  630.       Absturz? DOS kennt jedoch auch ein Interrupt, mit dem Sie zu DOS zurück-
  631.       gelangen. Der Befehl lautet:
  632.              INT 20H        ;Zurück zu DOS
  633.       Alles, was jetzt noch fehlt, ist ein Datenfeld im Speicher, das den
  634.       auszudruckenden Text enthält. Dazu verwenden wir die Pseudo-Op DB
  635.       declare Bytes):
  636.       MESSAGE DB  'Hello, World!$'     ;Auszudruckender Text
  637.       Der Speicher-Adresse wird der Name "MESSAGE" gegeben, weil die Zeile
  638.       mit dem Label "MESSAGE" in Spalte eins beginnt. Nun weiß CHASM, daß beim
  639.       vorangegangenen OFFSET-Befehl dieser Speicher-Bereich gemeint war. Sie
  640.       brauchen sich nicht darum zu sorgen, welche Adresse MESSAGE wirklich
  641.       hat, darum kümmert sich schon CHASM.
  642.       Vierzehn Bytes des Speichers enthalten nun die ASCII-Codes der Zeichen,
  643.       die sich im String "Hello, World!$" befinden.  Beachten Sie, daß der
  644.       String mit dem Zeichen "$" endet. Der DOS Funktions-Aufruf Nr. 9 druckt
  645.       Zeichen aus, bis er auf ein "$" stößt, hier stoppt er dann.
  646.       Wenn Sie das "$"-Zeichen am Ende des Strings vergessen haben, werden
  647.       Sie wohl nicht gerade vergnügt erleben, wie DOS versucht, den ganzen
  648.       Speicherinhalt auf dem Bildschirm auszudrucken.
  649.                                                                      24
  650.       Wenn wir alles zusammenfassen und einige Kommentare hinzufügen, so
  651.       sieht unser Programm folgendermaßen aus:
  652.       ;=====================================;
  653.       ; HELLO    Version 1.00               ;
  654.       ;          1984 by David Whitman      ;
  655.       ;                                     ;
  656.       ; Beispiel-Programm für CHASM.        ;
  657.       ; Druckt eine Begrüßung auf den Screen;
  658.       ;=====================================;
  659.               MOV AH, 9                 ;DOS Funktion 9 auswählen
  660.               MOV DX, OFFSET(MESSAGE)   ;Adresse des Text-Strings holen
  661.               INT 21H                   ;DOS aufrufen
  662.               INT 20H                   ;Zurück zu DOS
  663.       MESSAGE DB  'Hello, World!$'      ;Auszudruckender Text
  664.       Nachdem wir dieses Programm entworfen haben, müssen wir nur noch eine
  665.       Datei anlegen, die alle Zeilen des Programms enthält. Dies erledigen wir
  666.       mit einem Editor oder einer Textverarbeitung. (Natürlich werden Sie
  667.       dazu meistens einen Editor verwenden).
  668.       CHASM ließt nur Source-Dateien im Standard-DOS-Format, einige Textverar-
  669.       beitungen nennen dies auch "Dokument-" oder "ASCII-Modus".  Die meisten
  670.       Textverarbeitungen und jeder ordentliche Text-Editor arbeiten automa-
  671.       tisch mit diesem Format. Wordstar und Easywriter (und sicherlich noch
  672.       andere) arbeiten mit besonderen Formaten, das Handbuch müßte jedoch
  673.       Auskunft darüber geben, wie Sie dies ändern können.
  674.       Erzeugen Sie nun bitte eine Standard-DOS-Datei mit dem Namen HELLO.ASM,
  675.       die diese Programmzeilen beinhaltet. Sollten Sie keine Lust oder aber
  676.       Probleme haben: Die Datei EXAMPLE.ASM auf Ihrer CHASM-Diskette enthält
  677.       bereits das vollständige Programm. Sie müssen nur EXAMPLE.ASM in eine
  678.       neue Datei mit dem Namen HELLO.ASM kopieren.
  679.       Nun ist es Zeit, das Programm zu assemblieren. Zuvor müssen Sie die
  680.       CHASM-Disk initialisieren. Wie dies geht, können Sie im "User Manual"
  681.       unter "Setting up a CHASM Work Disk" lesen, oder kopieren Sie vorläufig
  682.       nur die Datei BASIC.COM von Ihrer DOS-Disk auf Ihre CHASM-Disk (Arbeits-
  683.       kopie!). Kopieren Sie außerdem HELLO.ASM auf diese Diskette.
  684.                                                                      25
  685.       Legen Sie die CHASM-Disk in Laufwerk A und starten Sie dann CHASM,
  686.       indem Sie seinen Namen eintippen:
  687.          A> CHASM
  688.       CHASM zeigt daraufhin eine Begrüßungs-Bildschirmseite an und fordert
  689.       Sie auf, eine Taste zu drücken, wenn Sie fertig sind. Danach fragt CHASM
  690.       Sie einige Fragen:
  691.           Source code file name? [.asm]
  692.       Geben Sie HELLO.ASM oder nur HELLO ein und drücken Sie RETURN. (Wenn
  693.       Sie keine Datei-Extension angeben, nimmt CHASM ".ASM" an).
  694.           Direct listing to Printer (P), Screen (S), or Disk (D)?
  695.       CHASM möchte wissen, wohin er das Listing während der Assemblierung
  696.       ausgeben soll. Haben Sie einen Drucker, so schalten Sie diesen ein und
  697.       drücken P. Haben Sie keinen Drucker, drücken Sie S.
  698.       Die letzte Frage ist:
  699.           Name for object file? [hello.com]
  700.       CHASM fragt nach dem Dateinamen des Maschinensprache-Programms, das
  701.       nun erzeugt werden soll. Drücken Sie hier nur ENTER.  CHASM nennt das
  702.       Programm dann HELLO.COM .
  703.       An dieser Stelle beginnt CHASM mit dem Zugriff auf das Diskettenlaufwerk
  704.       und ließt das Programm Zeile für Zeile. Eine Zustands-Zeile erscheint
  705.       unten am Bildschirm. Diese gibt Ihnen Auskunft darüber, wie weit die
  706.       Übersetzung schon fortgeschritten ist. Bei diesem Programm dauert der
  707.       ganze Vorgang ungefähr eine Minute.
  708.       Wenn das Listing auf den Drucker ausgegeben worden ist, kehrt CHASM
  709.       automatisch zu DOS zurück. Wurde es auf den Bildschirm ausgegeben,
  710.       wartet CHASM darauf, daß Sie eine Taste drücken als Zeichen dafür, daß
  711.       Sie es gelesen haben. Am Ende des Listings erscheint der Hinweis:
  712.       XXX Diagnostics Offered     (deutsch: XXX Diagnosen angeboten)
  713.       YYY Errors Detected         (deutsch: YYY Fehler entdeckt)
  714.                                                                      26
  715.       Sind beide Zahlen 0, ist alles in Ordnung. Wenn nicht, suchen Sie im
  716.       Listing nach den Fehlermeldungen, welche die fehlerhaften Zeilen an-
  717.       zeigen. Sie brauchen sich an dieser Stelle nicht darum zu kümmern, was
  718.       die Fehlermeldungen aussagen, vergleichen Sie nur die Programmdatei
  719.       Zeile für Zeile mit unserem Entwurf. Wenn Sie es geschaft haben, das
  720.       Programm ohne Fehler zu assemblieren, können Sie weiterlesen.
  721.       Ihre Diskette enthält jetzt einen Maschinenprogramm mit dem Namen
  722.       HELLO.COM. Überzeugen Sie sich davon, indem Sie sich mit DIR das Direk-
  723.       tory ansehen. Dort sollte die Datei aufgelistet sein.
  724.       Zum Starten des Maschinen-Programms müssen Sie nur den Namen ohne die
  725.       Extension .COM eintippen. (Hinweis: Die Datei hat die Extension ".COM"
  726.       von DOS bekommen, damit sie immer von DOS als Maschinen-Programm er-
  727.       kannt werden kann). Versuchen Sie es nun.
  728.       Schreiben Sie beim DOS-Prompt: HELLO. Ihr Disk-Laufwerk surrt nun eine
  729.       Sekunde, danach erscheint die Meldung "Hello, World!".
  730.       Als weitere Übung könnten Sie versuchen, einen Wagenrücklauf und einen
  731.       Zeilenvorschub auszuführen, bevor Sie die Nachricht ausgeben, damit sie
  732.       am Anfang der Zeile steht. Wagenrücklauf hat des ASCII-Code 13, Zeilen-
  733.       vorschub ist 10. Lesen Sie im "CHASM User's Manual" über die DB Pseudo-
  734.       Op nach. Fügen Sie diese dann an den Anfang des Strings, indem Sie deren
  735.       Dezimalwerte eingeben.
  736.       Versuchen Sie doch einmal, ein neues Programm namens "BEEP" zu schrei-
  737.       ben, welches das Klingel-Zeichen (ASCII Nr. 7) auf dem Bildschirm
  738.       schreibt. Sie können BEEP verwenden, um Ihre Mitarbeiter zu ärgern.
  739.       Hüten Sie sich aber davor, BEEP in einer Schleife aufzurufen!
  740.       Eine vorteilhaftere Übung wäre es, wenn Sie den Bildschirm vor dem
  741.       Ausgeben des Textes löschen würden. Der einfachste Weg wäre, die BIOS-
  742.       Funktion VIDEO_IO hierfür zu verwenden (dokumentiert auf den Seiten
  743.       A-43 bis A-44 im "Technischen Handbuch").  Die Kommentare im BIOS-
  744.       Listing erklären Ihnen genau, welche Werte in welches Register geladen
  745.       werden müssen, um den Bildschirm zu beeinflussen. Setzen Sie die
  746.       Register und rufen Sie dann das Interrupt INT 10H auf, damit der Bild-
  747.       schirm gelöscht und der Cursor in die linke obere Ecke gesetzt wird.
  748.  
  749.       Wenn Sie diese ganze Fibel gelesen und auch das Programm ausprobiert
  750.       haben, werden Sie es vielleicht verändern, Sie sind ja jetzt kein
  751.       Anfänger mehr. Sie sollten nun genug wissen, um das "CHASM User
  752.       Manual" und das Buch "The 8086 Book" zu verdauen. Dann können Sie
  753.       beginnen, Ihre eigenen Programme zu schreiben.     VIEL GLÜCK!
  754.  
  755.       Anmerkungen des Übersetzers: Sämtliche angegebene Literatur ist in
  756.                                    ENGLISCHER SPRACHE. Inzwischen dürfte
  757.                                    es jedoch sicherlich deutsche Über-
  758.                                    setzungen geben.
  759.  
  760.                   Bitte verzeihen Sie mir enige  ungenaue  Übersetzungen
  761.                   und  andere  Fehler, die Fibel wurde in amerikanischer
  762.                   (Umgangs-)Sprache geschrieben.  Ferner  habe  ich  die
  763.                   Übersetzung  eigentlich  nicht  zur  Veröffentlichung,
  764.                   sondern nur zur Erweiterung meines Vokabulars und  der
  765.                   Verbesserung  meiner  Englisch-Kenntnisse angefertigt.
  766.                   Eine Veröffentlichung war ursprünglich nicht geplant.
  767.  
  768.          Ich hoffe, daß Ihnen diese Fibel nützlich sein wird.
  769.  
  770.                                                         TOASTI
  771.  
  772.         Ergänzung am 07.08.1991:
  773.  
  774.         Mein   besonderer   Dank   geht   an   Frau   Petra   Fischbäck,
  775.         Schleißheimerstr.  257 in W-8000  München  40,  die  die  vielen
  776.         Rechtschreib- und Tippfehler usw. beseitigt hat.
  777.